package com.zhentao.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用户服务 - 使用内存存储
 */
@Slf4j
@Service
public class UserMemoryService {
    
    // 内存存储用户token和用户信息
    private final ConcurrentHashMap<String, String> tokenToPhoneMap = new ConcurrentHashMap<>();
    private final ConcurrentHashMap<String, Map<String, Object>> userInfoMap = new ConcurrentHashMap<>();
    private final ConcurrentHashMap<String, Long> tokenCreateTimeMap = new ConcurrentHashMap<>();
    
    private static final int TOKEN_EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000; // 7天（毫秒）
    
    /**
     * 根据手机号登录
     * @param phoneNumber 手机号
     * @return 登录结果
     */
    public Map<String, Object> loginByPhone(String phoneNumber) {
        // 生成用户token
        String token = UUID.randomUUID().toString().replace("-", "");
        
        // 构建用户信息
        Map<String, Object> userInfo = new HashMap<>();
        userInfo.put("id", generateUserId(phoneNumber));
        userInfo.put("phone", phoneNumber);
        userInfo.put("nickname", "用户" + phoneNumber.substring(7));
        userInfo.put("avatar", "");
        userInfo.put("isLogin", true);
        userInfo.put("loginTime", System.currentTimeMillis());
        
        // 存储到内存
        tokenToPhoneMap.put(token, phoneNumber);
        userInfoMap.put(phoneNumber, userInfo);
        tokenCreateTimeMap.put(token, System.currentTimeMillis());
        
        log.info("用户 {} 登录成功，生成token: {}", phoneNumber, token);
        
        // 返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("userInfo", userInfo);
        
        return result;
    }
    
    /**
     * 根据token获取用户信息
     * @param token 用户token
     * @return 用户信息
     */
    public Map<String, Object> getUserByToken(String token) {
        String phoneNumber = tokenToPhoneMap.get(token);
        
        if (phoneNumber == null) {
            return null;
        }
        
        // 检查token是否过期
        Long createTime = tokenCreateTimeMap.get(token);
        if (createTime == null || System.currentTimeMillis() - createTime > TOKEN_EXPIRE_TIME) {
            // token过期，清理相关数据
            tokenToPhoneMap.remove(token);
            tokenCreateTimeMap.remove(token);
            return null;
        }
        
        return userInfoMap.get(phoneNumber);
    }
    
    /**
     * 验证token是否有效
     * @param token 用户token
     * @return 是否有效
     */
    public boolean validateToken(String token) {
        String phoneNumber = tokenToPhoneMap.get(token);
        if (phoneNumber == null) {
            return false;
        }
        
        // 检查token是否过期
        Long createTime = tokenCreateTimeMap.get(token);
        if (createTime == null || System.currentTimeMillis() - createTime > TOKEN_EXPIRE_TIME) {
            // token过期，清理相关数据
            tokenToPhoneMap.remove(token);
            tokenCreateTimeMap.remove(token);
            return false;
        }
        
        return true;
    }
    
    /**
     * 生成用户ID
     * @param phoneNumber 手机号
     * @return 用户ID
     */
    private Long generateUserId(String phoneNumber) {
        // 简单的用户ID生成策略，实际项目中应该从数据库获取
        return Long.valueOf(phoneNumber.substring(7));
    }
}
